import java.io.*;
import java.net.*;
import java.util.HashMap;

class Client {
	public static void main(String[] args) {

		Socket MyClient;
		BufferedInputStream input;
		BufferedOutputStream output;
		int[][] board = new int[8][8];
		int numJoueur = 0;
		int couleurPion = 0; //La couleur contient en réalité le num équivalent (2 pour les noirs, 4 pour les blancs)
		int couleurPionAdverse = 0;
		int numCoup = 0;
		String lastMvt = "";
		GenerateurMouvement gen;
		try {
			MyClient = new Socket("localhost", 8888);
			input = new BufferedInputStream(MyClient.getInputStream());
			output = new BufferedOutputStream(MyClient.getOutputStream());
			BufferedReader console = new BufferedReader(new InputStreamReader(
					System.in));
			while (1 == 1) {
				char cmd = 0;

				cmd = (char) input.read();

				// Début de la partie en joueur blanc
				if (cmd == '1') {
					numJoueur = 1;
					couleurPion = 4;
					couleurPionAdverse = 2;
					byte[] aBuffer = new byte[1024];

					int size = input.available();
					// System.out.println("size " + size);
					input.read(aBuffer, 0, size);
					String s = new String(aBuffer).trim();
					String[] boardValues;
					boardValues = s.split(" ");
					int x = 0, y = 0;
					for (int i = 0; i < boardValues.length; i++) {
						board[x][y] = Integer.parseInt(boardValues[i]);
						y++;
						if (y == 8) {
							y = 0;
							x++;
						}
					}

					System.out
							.println("Nouvelle partie! Vous jouer blanc, entrez votre premier coup : ");
					String move = null;
					
					//On génère les mouvements possibles
					gen = new GenerateurMouvement(board, couleurPion,numCoup);
					numCoup++;
					move = gen.getMvtApresElagage();
					lastMvt = move;
					deplacerPion(board, move, couleurPion);
					
					output.write(move.getBytes(), 0, move.length());
					output.flush();
				}
				// Début de la partie en joueur Noir
				else if (cmd == '2') {
					numJoueur = 2;
					couleurPion = 2;
					couleurPionAdverse = 4;
					System.out
							.println("Nouvelle partie! Vous jouer noir, attendez le coup des blancs");
					byte[] aBuffer = new byte[1024];

					int size = input.available();
					// System.out.println("size " + size);
					input.read(aBuffer, 0, size);
					String s = new String(aBuffer).trim();
					String[] boardValues;
					boardValues = s.split(" ");
					int x = 0, y = 0;
					for (int i = 0; i < boardValues.length; i++) {
						board[x][y] = Integer.parseInt(boardValues[i]);
						y++;
						if (y == 8) {
							y = 0;
							x++;
						}
					}
				}

				// Le serveur demande le prochain coup
				// Le message contient aussi le dernier coup joué.
				else if (cmd == '3') {
					byte[] aBuffer = new byte[16];

					int size = input.available();
					// System.out.println("size " + size);
					input.read(aBuffer, 0, size);

					String s = new String(aBuffer);
					System.out.println("Dernier coup : " + s);
					System.out.println("Entrez votre coup : ");
					String move = null;

					// On va déplacer le pion sur le board pour avoir l'état
					// actuel du plateau. On envoi aussi la couleur du pion adverse
					board = deplacerPion(board, s, couleurPionAdverse);

					//On génère les mouvements possibles
					gen = new GenerateurMouvement(board, couleurPion,numCoup);
					numCoup++;
					move = gen.getMvtApresElagage();
					lastMvt = move;
					deplacerPion(board, move, couleurPion);
					
					//A SUPPRIMER PLUS TARD
					/*try{
						Thread.sleep(2000);
					}catch(InterruptedException e){}
					*/
					output.write(move.getBytes(), 0, move.length());
					output.flush();
				}
				// Le dernier coup est invalide
				else if (cmd == '4') {
					System.out
							.println("Coup invalide, entrez un nouveau coup : ");
					
					//On annule le dernier déplacement
					String mvt;
					mvt = lastMvt.trim();
					String[] tabMvt = mvt.split(" - ");
					mvt = tabMvt[1]+" - "+tabMvt[0]; //On inverse le déplacement pour lui faire demi-tour
					deplacerPion(board, mvt, couleurPion);
					
					String move = null;
					//move = console.readLine();
					
					gen = new GenerateurMouvement(board, couleurPion,numCoup);
					numCoup++;
					move = gen.getMvtApresElagage();
					lastMvt = move;
					deplacerPion(board, move, couleurPion);
					
					output.write(move.getBytes(), 0, move.length());
					output.flush();

				}
			}
		} catch (IOException e) {
			System.out.println(e);
		}
	}
	
	public static int[][] deplacerPion(int[][] board, String mvt, int couleurP) {
		HashMap<Character, Integer> aMap = new HashMap<Character, Integer>();
		aMap.put('A' , 0);
		aMap.put('B' , 1);
		aMap.put('C' , 2);
		aMap.put('D' , 3);
		aMap.put('E' , 4);
		aMap.put('F' , 5);
		aMap.put('G' , 6);
		aMap.put('H' , 7);
		
		mvt = mvt.trim();
		String[] tabMvt = mvt.split(" - ");
		
		int numColonneDep = aMap.get(tabMvt[0].charAt(0));
		int numColonneArr = aMap.get(tabMvt[1].charAt(0));
		
		int numLigneDep = 8-Integer.parseInt(tabMvt[0].charAt(1)+""); //Les valeurs sont inversées par rapport au tableau, d'ou le 8-
		int numLigneArr = 8-Integer.parseInt(tabMvt[1].charAt(1)+""); //Les valeurs sont inversées par rapport au tableau, d'ou le 8-
		
		board[numLigneDep][numColonneDep] = 0;
		board[numLigneArr][numColonneArr] = couleurP;
		
		for(int i=0; i<8; i++) {
			for(int j=0; j<8; j++) {
				System.out.print(board[i][j]+",");
			}
			System.out.println("");
		}
		return board;
	}
}